#include <string>
#include <cstring>
#include <iostream>

// reference
template <typename T>
inline T const& max(T const& a, T const& b)
{
    return a < b ? b : a;
}

// value
inline char const* max(char const* a, char const* b)
{
    return std::strcmp(a, b) < 0 ? b : a;
}

// reference
template <typename T>
inline T const& max(T const& a, T const& b, T const& c)
{
    return max(max(a,b), c);
}

int main()
{
    std::cout<<::max(7, 42, 68)<<std::endl;

    const char* s1 = "test";
    const char* s2 = "what";
    const char* s3 = "fuck";
    std::cout<<::max(s1, s2, s3)<<std::endl;
}

